在了解K8s的功能後,我們就要來了解K8s是使用那些元件來管理容器,就像在docker中有最小的單位container一樣,k8s中的最小單位則是pod,清楚了解每個元件所負責的工作是非常重要的事,有的元件像大腦一樣負責控制和管理,有些則像是四肢負責進行操作完成任務,但只要缺少任何一個元件就可能無法完成任務,因此這個章節會讓大家清楚知道每個元件的功能和如何使用。
在k8s中的元件是可以區分出大小順序的。從小到大排序分為: Pod -> Node -> Controller Plane -> Cluster。
pod 是 Kubernetes 運作的最小單位,一個 Pod 對應到一個應用服務(Application) ,負責裝一個或多個多個 Container (容器),但一般情況一個 Pod 最好只有一個 Container
,同一個 Pod 中的 Containers 共享相同資源及網路,原因是如果每個 Container 都作為 K8S 的最小單位,那麼管理網路會變得非常的困難,以 Pod 來區隔彼此透過 local port number 溝通。
Kubernetes 運作的最小硬體單位,一個 Worker Node(簡稱 Node)對應到一台機器,可以是實體機如你的筆電、或是虛擬機如 AWS 上的一台 EC2 或 GCP 上的一台 Computer Engine。
每個 Node 中都有三個組件:kubelet、kube-proxy、Container Runtime。
kubelet
主要為和 Master 溝通的元件,能讀取管理當前Node的狀態
kube-proxy
用來反應 K8S 各個 Node 上的網路服務,並更新 Node 的ip位置
Container Runtime
像是 Docker Engine 的功能,負責執行容器的程式
Kubernetes 運作的指揮中心,可以簡化看成一個特化的 Node 負責管理所有其他 Node。一個 Master Node(簡稱 Master)中有四個組件:kube-apiserver、etcd、kube-scheduler、kube-controller-manager。
kube-apiserver
etcd
kube-controller-manager
負責管理並運行 Kubernetes controller 的組件,簡單來說 controller 就是 Kubernetes 裡一個個負責監視 Cluster 狀態的 Process,例如:Node Controller、Replication Controller
這些 Process 會在 Cluster 與預期狀態(desire state)不符時嘗試更新現有狀態(current state)。例如:現在要多開一台機器以應付突然增加的流量,那我的預期狀態就會更新成 N+1,現有狀態為 N,這時相對應的 controller 就會想辦法多開一台機器
controller-manager 的監視與嘗試更新也都需要透過訪問 kube-apiserver 達成
kube-scheduler
Kubernetes 中多個 Node 與 Master 的集合。基本上可以想成在同一個環境裡所有 Node 集合在一起的單位。
基本運作
接下來我們用一個簡單的問題「Kubernetes 是如何建立一個 Pod?」來複習整體 Kubernetes 的架構。上圖為一個簡易的 Kubernetes Cluster,通常一個 Cluster 中其實會有多個 Master 作為備援,但為了簡化我們只顯示一個。
當使用者要部署一個新的 Pod 到 Kubernetes Cluster 時,使用者要先透過 User Command(kubectl)輸入建立 Pod 的對應指令(下面會在解說如何實際動手操作來建立一個 Pod)。此時指令會經過一層確認使用者身份的認證後,傳遞到 Master Node 中的 API Server,API Server 會把指令備份到 etcd 。
接下來 controller-manager 會從 API Server 收到需要創建一個新的 Pod 的訊息,並檢查如果資源許可,就會建立一個新的 Pod。最後 Scheduler 在定期訪問 API Server 時,會詢問 controller-manager 是否有建置新的 Pod,如果發現新建立的 Pod 時,Scheduler 就會負責把 Pod 配送到最適合的一個 Node 上面。
雖然上面的基本運作看似複雜,但實際上我們在操作時,只要輸入一行指令後 Kubernetes 就會自動幫我們完成後續的動作。